{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Python for Finance (2nd ed.)\n",
    "\n",
    "**Mastering Data-Driven Finance**\n",
    "\n",
    "&copy; Dr. Yves J. Hilpisch | The Python Quants GmbH\n",
    "\n",
    "<img src=\"http://hilpisch.com/images/py4fi_2nd_shadow.png\" width=\"300px\" align=\"left\">"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Analysis with pandas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## pandas Basics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### First Steps with DataFrame Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "uuid": "eda2a742-134d-4d47-8b30-557b846b9bb3"
   },
   "outputs": [],
   "source": [
    "import pandas as pd  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame([10, 20, 30, 40],  \n",
    "                  columns=['numbers'],  \n",
    "                  index=['a', 'b', 'c', 'd'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "uuid": "f3be2d89-829a-49b2-96fc-07c475db1e3f"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a       10\n",
       "b       20\n",
       "c       30\n",
       "d       40"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "uuid": "47b70a7b-710f-4c40-9a70-b09db7af1a12"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['a', 'b', 'c', 'd'], dtype='object')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.index  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "uuid": "a36c6695-520d-4df1-a6fa-5f8362af37a3"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['numbers'], dtype='object')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "uuid": "c93aed37-21de-429d-86ed-9849e4c3e23c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    30\n",
       "Name: c, dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc['c']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "uuid": "8c7c2f69-3673-40d9-a568-0471c629810d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a       10\n",
       "d       40"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[['a', 'd']]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "uuid": "c3ce0cc3-26e8-4256-ab8c-9a2d4b181633"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "b       20\n",
       "c       30"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:3]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "uuid": "94b1d846-63df-49f4-8a7f-8fed03e5f4fa"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    100\n",
       "dtype: int64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "uuid": "4e73eb4f-352d-4527-b0c5-4f3a6e7eb354"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a      100\n",
       "b      400\n",
       "c      900\n",
       "d     1600"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(lambda x: x ** 2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "uuid": "75206a83-0154-4be2-88d0-7a82a190fda1"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers\n",
       "a      100\n",
       "b      400\n",
       "c      900\n",
       "d     1600"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df ** 2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['floats'] = (1.5, 2.5, 3.5, 4.5)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "uuid": "49a2633a-b3c0-4d00-a227-e0ff4a8cf81d"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats\n",
       "a       10     1.5\n",
       "b       20     2.5\n",
       "c       30     3.5\n",
       "d       40     4.5"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "uuid": "c49b9aea-417a-4c2b-8e27-0e8771a77c87"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a    1.5\n",
       "b    2.5\n",
       "c    3.5\n",
       "d    4.5\n",
       "Name: floats, dtype: float64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['floats']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['names'] = pd.DataFrame(['Yves', 'Sandra', 'Lilli', 'Henry'],\n",
    "                           index=['d', 'a', 'b', 'c'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "uuid": "aa892c41-6637-45ed-876b-6a70285e4c0b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.5</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.5</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.5</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.5</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a       10     1.5  Sandra\n",
       "b       20     2.5   Lilli\n",
       "c       30     3.5   Henry\n",
       "d       40     4.5    Yves"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "uuid": "584ac18c-161f-4c7b-8ff1-1cd406fb8437"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>10</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>30</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>40</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "0       10    1.50  Sandra\n",
       "1       20    2.50   Lilli\n",
       "2       30    3.50   Henry\n",
       "3       40    4.50    Yves\n",
       "4      100    5.75     Jil"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.append({'numbers': 100, 'floats': 5.75, 'names': 'Jil'},\n",
    "               ignore_index=True)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.append(pd.DataFrame({'numbers': 100, 'floats': 5.75,\n",
    "                             'names': 'Jil'}, index=['y',]))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "uuid": "9068cd04-c6ff-4d0c-bd52-cf04cd89a0e9"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>100</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a       10    1.50  Sandra\n",
       "b       20    2.50   Lilli\n",
       "c       30    3.50   Henry\n",
       "d       40    4.50    Yves\n",
       "y      100    5.75     Jil"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.append(pd.DataFrame({'names': 'Liz'}, index=['z',]), sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "uuid": "9068cd04-c6ff-4d0c-bd52-cf04cd89a0e9"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>numbers</th>\n",
       "      <th>floats</th>\n",
       "      <th>names</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>10.0</td>\n",
       "      <td>1.50</td>\n",
       "      <td>Sandra</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>20.0</td>\n",
       "      <td>2.50</td>\n",
       "      <td>Lilli</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>30.0</td>\n",
       "      <td>3.50</td>\n",
       "      <td>Henry</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>40.0</td>\n",
       "      <td>4.50</td>\n",
       "      <td>Yves</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>y</th>\n",
       "      <td>100.0</td>\n",
       "      <td>5.75</td>\n",
       "      <td>Jil</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>z</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Liz</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   numbers  floats   names\n",
       "a     10.0    1.50  Sandra\n",
       "b     20.0    2.50   Lilli\n",
       "c     30.0    3.50   Henry\n",
       "d     40.0    4.50    Yves\n",
       "y    100.0    5.75     Jil\n",
       "z      NaN     NaN     Liz"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    float64\n",
       "floats     float64\n",
       "names       object\n",
       "dtype: object"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "uuid": "3e863c7f-7875-4911-997b-6e48123dc1e5"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    40.00\n",
       "floats      3.55\n",
       "dtype: float64"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['numbers', 'floats']].mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "uuid": "c52173a0-485d-4eb2-b6b4-407d1ff2c30e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "numbers    35.355339\n",
       "floats      1.662077\n",
       "dtype: float64"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['numbers', 'floats']].std()  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Second Steps with DataFrame Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "a = np.random.standard_normal((9, 4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "uuid": "d6f56a00-91e6-4221-a1ec-6093f416d1be"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(a)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "uuid": "450bd14d-7668-4f3f-a863-966f13562818"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3\n",
       "0 -1.749765  0.342680  1.153036 -0.252436\n",
       "1  0.981321  0.514219  0.221180 -1.070043\n",
       "2 -0.189496  0.255001 -0.458027  0.435163\n",
       "3 -0.583595  0.816847  0.672721 -0.104411\n",
       "4 -0.531280  1.029733 -0.438136 -1.118318\n",
       "5  1.618982  1.541605 -0.251879 -0.842436\n",
       "6  0.184519  0.937082  0.731000  1.361556\n",
       "7 -0.326238  0.055676  0.222400 -1.443217\n",
       "8 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.columns = ['No1', 'No2', 'No3', 'No4']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "uuid": "968395a4-12bc-46d2-b486-6c767abce366"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        No1       No2       No3       No4\n",
       "0 -1.749765  0.342680  1.153036 -0.252436\n",
       "1  0.981321  0.514219  0.221180 -1.070043\n",
       "2 -0.189496  0.255001 -0.458027  0.435163\n",
       "3 -0.583595  0.816847  0.672721 -0.104411\n",
       "4 -0.531280  1.029733 -0.438136 -1.118318\n",
       "5  1.618982  1.541605 -0.251879 -0.842436\n",
       "6  0.184519  0.937082  0.731000  1.361556\n",
       "7 -0.326238  0.055676  0.222400 -1.443217\n",
       "8 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "uuid": "68e8d73f-93d3-47ac-a656-1edbdebcd1ff"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7010330941456459"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['No2'].mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "dates = pd.date_range('2019-1-1', periods=9, freq='M')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "uuid": "a80e1e88-d211-4ee4-a6d3-90403a7739a8"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30',\n",
       "               '2019-05-31', '2019-06-30', '2019-07-31', '2019-08-31',\n",
       "               '2019-09-30'],\n",
       "              dtype='datetime64[ns]', freq='M')"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.index = dates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "uuid": "d8fef9ed-25ca-4ae0-bd0c-026d340a903b"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436\n",
       "2019-02-28  0.981321  0.514219  0.221180 -1.070043\n",
       "2019-03-31 -0.189496  0.255001 -0.458027  0.435163\n",
       "2019-04-30 -0.583595  0.816847  0.672721 -0.104411\n",
       "2019-05-31 -0.531280  1.029733 -0.438136 -1.118318\n",
       "2019-06-30  1.618982  1.541605 -0.251879 -0.842436\n",
       "2019-07-31  0.184519  0.937082  0.731000  1.361556\n",
       "2019-08-31 -0.326238  0.055676  0.222400 -1.443217\n",
       "2019-09-30 -0.756352  0.816454  0.750445 -0.455947"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "uuid": "bcc38d60-3e1c-49bb-b883-ea7564c136b4"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604],\n",
       "       [ 0.98132079,  0.51421884,  0.22117967, -1.07004333],\n",
       "       [-0.18949583,  0.25500144, -0.45802699,  0.43516349],\n",
       "       [-0.58359505,  0.81684707,  0.67272081, -0.10441114],\n",
       "       [-0.53128038,  1.02973269, -0.43813562, -1.11831825],\n",
       "       [ 1.61898166,  1.54160517, -0.25187914, -0.84243574],\n",
       "       [ 0.18451869,  0.9370822 ,  0.73100034,  1.36155613],\n",
       "       [-0.32623806,  0.05567601,  0.22239961, -1.443217  ],\n",
       "       [-0.75635231,  0.81645401,  0.75044476, -0.45594693]])"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic Analytics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "DatetimeIndex: 9 entries, 2019-01-31 to 2019-09-30\n",
      "Freq: M\n",
      "Data columns (total 4 columns):\n",
      "No1    9 non-null float64\n",
      "No2    9 non-null float64\n",
      "No3    9 non-null float64\n",
      "No4    9 non-null float64\n",
      "dtypes: float64(4)\n",
      "memory usage: 360.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "uuid": "125980cc-91ec-4ab4-9a4a-cfd772dd1254"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "      <td>9.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>-0.150212</td>\n",
       "      <td>0.701033</td>\n",
       "      <td>0.289193</td>\n",
       "      <td>-0.387788</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.988306</td>\n",
       "      <td>0.457685</td>\n",
       "      <td>0.579920</td>\n",
       "      <td>0.877532</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-0.455947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            No1       No2       No3       No4\n",
       "count  9.000000  9.000000  9.000000  9.000000\n",
       "mean  -0.150212  0.701033  0.289193 -0.387788\n",
       "std    0.988306  0.457685  0.579920  0.877532\n",
       "min   -1.749765  0.055676 -0.458027 -1.443217\n",
       "25%   -0.583595  0.342680 -0.251879 -1.070043\n",
       "50%   -0.326238  0.816454  0.222400 -0.455947\n",
       "75%    0.184519  0.937082  0.731000 -0.104411\n",
       "max    1.618982  1.541605  1.153036  1.361556"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "uuid": "f760ea25-c64c-4e70-9f91-b72701d919ce"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -1.351906\n",
       "No2    6.309298\n",
       "No3    2.602739\n",
       "No4   -3.490089\n",
       "dtype: float64"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "uuid": "3dd9bd77-eb80-46cb-87f3-62c053a8e223"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(axis=0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-01-31   -0.126621\n",
       "2019-02-28    0.161669\n",
       "2019-03-31    0.010661\n",
       "2019-04-30    0.200390\n",
       "2019-05-31   -0.264500\n",
       "2019-06-30    0.516568\n",
       "2019-07-31    0.803539\n",
       "2019-08-31   -0.372845\n",
       "2019-09-30    0.088650\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "uuid": "8e167ea8-09b7-4585-8cac-28fe20eefe66"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>-0.768445</td>\n",
       "      <td>0.856899</td>\n",
       "      <td>1.374215</td>\n",
       "      <td>-1.322479</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.957941</td>\n",
       "      <td>1.111901</td>\n",
       "      <td>0.916188</td>\n",
       "      <td>-0.887316</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-1.541536</td>\n",
       "      <td>1.928748</td>\n",
       "      <td>1.588909</td>\n",
       "      <td>-0.991727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-2.072816</td>\n",
       "      <td>2.958480</td>\n",
       "      <td>1.150774</td>\n",
       "      <td>-2.110045</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>-0.453834</td>\n",
       "      <td>4.500086</td>\n",
       "      <td>0.898895</td>\n",
       "      <td>-2.952481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>-0.269316</td>\n",
       "      <td>5.437168</td>\n",
       "      <td>1.629895</td>\n",
       "      <td>-1.590925</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.595554</td>\n",
       "      <td>5.492844</td>\n",
       "      <td>1.852294</td>\n",
       "      <td>-3.034142</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-1.351906</td>\n",
       "      <td>6.309298</td>\n",
       "      <td>2.602739</td>\n",
       "      <td>-3.490089</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436\n",
       "2019-02-28 -0.768445  0.856899  1.374215 -1.322479\n",
       "2019-03-31 -0.957941  1.111901  0.916188 -0.887316\n",
       "2019-04-30 -1.541536  1.928748  1.588909 -0.991727\n",
       "2019-05-31 -2.072816  2.958480  1.150774 -2.110045\n",
       "2019-06-30 -0.453834  4.500086  0.898895 -2.952481\n",
       "2019-07-31 -0.269316  5.437168  1.629895 -1.590925\n",
       "2019-08-31 -0.595554  5.492844  1.852294 -3.034142\n",
       "2019-09-30 -1.351906  6.309298  2.602739 -3.490089"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.cumsum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1   -0.150212\n",
       "No2    0.701033\n",
       "No3    0.289193\n",
       "No4   -0.387788\n",
       "dtype: float64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mean(df)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/yves/miniconda3/envs/py4fi2nd/lib/python3.6/site-packages/ipykernel_launcher.py:2: RuntimeWarning: invalid value encountered in log\n",
      "  \n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.070957</td>\n",
       "      <td>0.142398</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>-0.018856</td>\n",
       "      <td>-0.665106</td>\n",
       "      <td>-1.508780</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.366486</td>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.832033</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.202303</td>\n",
       "      <td>-0.396425</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.029299</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>0.481797</td>\n",
       "      <td>0.432824</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>-1.690005</td>\n",
       "      <td>-0.064984</td>\n",
       "      <td>-0.313341</td>\n",
       "      <td>0.308628</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-2.888206</td>\n",
       "      <td>-1.503279</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.202785</td>\n",
       "      <td>-0.287089</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31       NaN -1.070957  0.142398       NaN\n",
       "2019-02-28 -0.018856 -0.665106 -1.508780       NaN\n",
       "2019-03-31       NaN -1.366486       NaN -0.832033\n",
       "2019-04-30       NaN -0.202303 -0.396425       NaN\n",
       "2019-05-31       NaN  0.029299       NaN       NaN\n",
       "2019-06-30  0.481797  0.432824       NaN       NaN\n",
       "2019-07-31 -1.690005 -0.064984 -0.313341  0.308628\n",
       "2019-08-31       NaN -2.888206 -1.503279       NaN\n",
       "2019-09-30       NaN -0.202785 -0.287089       NaN"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# raises warning\n",
    "np.log(df)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "uuid": "9dfc1e40-c030-4a9c-9e3a-ff28c64a93df"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>1.322787</td>\n",
       "      <td>0.585389</td>\n",
       "      <td>1.073795</td>\n",
       "      <td>0.502430</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.990616</td>\n",
       "      <td>0.717091</td>\n",
       "      <td>0.470297</td>\n",
       "      <td>1.034429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>0.435311</td>\n",
       "      <td>0.504977</td>\n",
       "      <td>0.676777</td>\n",
       "      <td>0.659669</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>0.763934</td>\n",
       "      <td>0.903796</td>\n",
       "      <td>0.820196</td>\n",
       "      <td>0.323127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>0.728890</td>\n",
       "      <td>1.014757</td>\n",
       "      <td>0.661918</td>\n",
       "      <td>1.057506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.272392</td>\n",
       "      <td>1.241614</td>\n",
       "      <td>0.501876</td>\n",
       "      <td>0.917843</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.429556</td>\n",
       "      <td>0.968030</td>\n",
       "      <td>0.854986</td>\n",
       "      <td>1.166857</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>0.571173</td>\n",
       "      <td>0.235958</td>\n",
       "      <td>0.471593</td>\n",
       "      <td>1.201340</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>0.869685</td>\n",
       "      <td>0.903578</td>\n",
       "      <td>0.866282</td>\n",
       "      <td>0.675238</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4\n",
       "2019-01-31  1.322787  0.585389  1.073795  0.502430\n",
       "2019-02-28  0.990616  0.717091  0.470297  1.034429\n",
       "2019-03-31  0.435311  0.504977  0.676777  0.659669\n",
       "2019-04-30  0.763934  0.903796  0.820196  0.323127\n",
       "2019-05-31  0.728890  1.014757  0.661918  1.057506\n",
       "2019-06-30  1.272392  1.241614  0.501876  0.917843\n",
       "2019-07-31  0.429556  0.968030  0.854986  1.166857\n",
       "2019-08-31  0.571173  0.235958  0.471593  1.201340\n",
       "2019-09-30  0.869685  0.903578  0.866282  0.675238"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(abs(df))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {
    "uuid": "a540362b-50d7-4ef0-89ba-0b6ee38033f6"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "No1    7.384345\n",
       "No2    7.075190\n",
       "No3    6.397719\n",
       "No4    7.538440\n",
       "dtype: float64"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.sqrt(abs(df)).sum()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-74.976547</td>\n",
       "      <td>134.268040</td>\n",
       "      <td>215.303580</td>\n",
       "      <td>74.756396</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>198.132079</td>\n",
       "      <td>151.421884</td>\n",
       "      <td>122.117967</td>\n",
       "      <td>-7.004333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>81.050417</td>\n",
       "      <td>125.500144</td>\n",
       "      <td>54.197301</td>\n",
       "      <td>143.516349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>41.640495</td>\n",
       "      <td>181.684707</td>\n",
       "      <td>167.272081</td>\n",
       "      <td>89.558886</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>46.871962</td>\n",
       "      <td>202.973269</td>\n",
       "      <td>56.186438</td>\n",
       "      <td>-11.831825</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>261.898166</td>\n",
       "      <td>254.160517</td>\n",
       "      <td>74.812086</td>\n",
       "      <td>15.756426</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>118.451869</td>\n",
       "      <td>193.708220</td>\n",
       "      <td>173.100034</td>\n",
       "      <td>236.155613</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>67.376194</td>\n",
       "      <td>105.567601</td>\n",
       "      <td>122.239961</td>\n",
       "      <td>-44.321700</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>24.364769</td>\n",
       "      <td>181.645401</td>\n",
       "      <td>175.044476</td>\n",
       "      <td>54.405307</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   No1         No2         No3         No4\n",
       "2019-01-31  -74.976547  134.268040  215.303580   74.756396\n",
       "2019-02-28  198.132079  151.421884  122.117967   -7.004333\n",
       "2019-03-31   81.050417  125.500144   54.197301  143.516349\n",
       "2019-04-30   41.640495  181.684707  167.272081   89.558886\n",
       "2019-05-31   46.871962  202.973269   56.186438  -11.831825\n",
       "2019-06-30  261.898166  254.160517   74.812086   15.756426\n",
       "2019-07-31  118.451869  193.708220  173.100034  236.155613\n",
       "2019-08-31   67.376194  105.567601  122.239961  -44.321700\n",
       "2019-09-30   24.364769  181.645401  175.044476   54.405307"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "100 * df + 100  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Basic Visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pylab import plt, mpl  \n",
    "plt.style.use('seaborn')  \n",
    "mpl.rcParams['font.family'] = 'serif'  \n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {
    "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.cumsum().plot(lw=2.0, figsize=(10, 6));  \n",
    "# plt.savefig('../../images/ch05/pd_plot_01.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {
    "uuid": "4b1834ec-9f9b-41d6-8d06-f2efc8433dc4"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df.plot.bar(figsize=(10, 6), rot=30);  \n",
    "# df.plot(kind='bar', figsize=(10, 6))  \n",
    "# plt.savefig('../../images/ch05/pd_plot_02.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Series Class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "uuid": "e86f82d1-5934-42d3-a986-f01bc829adaa"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.frame.DataFrame"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "S = pd.Series(np.linspace(0, 15, 7), name='series')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     0.0\n",
       "1     2.5\n",
       "2     5.0\n",
       "3     7.5\n",
       "4    10.0\n",
       "5    12.5\n",
       "6    15.0\n",
       "Name: series, dtype: float64"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(S)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "s = df['No1']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2019-01-31   -1.749765\n",
       "2019-02-28    0.981321\n",
       "2019-03-31   -0.189496\n",
       "2019-04-30   -0.583595\n",
       "2019-05-31   -0.531280\n",
       "2019-06-30    1.618982\n",
       "2019-07-31    0.184519\n",
       "2019-08-31   -0.326238\n",
       "2019-09-30   -0.756352\n",
       "Freq: M, Name: No1, dtype: float64"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "uuid": "ca241ef9-5359-4c89-bc92-be6346cb3959"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.series.Series"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(s)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.15021177307319458"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "uuid": "b3d4cc90-e499-459c-88a5-011fde80d864"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "s.plot(lw=2.0, figsize=(10, 6));\n",
    "# plt.savefig('../../images/ch05/pd_plot_03.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## GroupBy Operations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "scrolled": true,
    "uuid": "4bc106dd-9590-4566-bc70-d410517c8223"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "      <th>Quarter</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2019-01-31</th>\n",
       "      <td>-1.749765</td>\n",
       "      <td>0.342680</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>-0.252436</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-02-28</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>0.221180</td>\n",
       "      <td>-1.070043</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-03-31</th>\n",
       "      <td>-0.189496</td>\n",
       "      <td>0.255001</td>\n",
       "      <td>-0.458027</td>\n",
       "      <td>0.435163</td>\n",
       "      <td>Q1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-04-30</th>\n",
       "      <td>-0.583595</td>\n",
       "      <td>0.816847</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-05-31</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>1.029733</td>\n",
       "      <td>-0.438136</td>\n",
       "      <td>-1.118318</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-06-30</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>-0.251879</td>\n",
       "      <td>-0.842436</td>\n",
       "      <td>Q2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-07-31</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.731000</td>\n",
       "      <td>1.361556</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-08-31</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>0.055676</td>\n",
       "      <td>0.222400</td>\n",
       "      <td>-1.443217</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2019-09-30</th>\n",
       "      <td>-0.756352</td>\n",
       "      <td>0.816454</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>-0.455947</td>\n",
       "      <td>Q3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 No1       No2       No3       No4 Quarter\n",
       "2019-01-31 -1.749765  0.342680  1.153036 -0.252436      Q1\n",
       "2019-02-28  0.981321  0.514219  0.221180 -1.070043      Q1\n",
       "2019-03-31 -0.189496  0.255001 -0.458027  0.435163      Q1\n",
       "2019-04-30 -0.583595  0.816847  0.672721 -0.104411      Q2\n",
       "2019-05-31 -0.531280  1.029733 -0.438136 -1.118318      Q2\n",
       "2019-06-30  1.618982  1.541605 -0.251879 -0.842436      Q2\n",
       "2019-07-31  0.184519  0.937082  0.731000  1.361556      Q3\n",
       "2019-08-31 -0.326238  0.055676  0.222400 -1.443217      Q3\n",
       "2019-09-30 -0.756352  0.816454  0.750445 -0.455947      Q3"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['Quarter'] = ['Q1', 'Q1', 'Q1', 'Q2', 'Q2',\n",
    "                 'Q2', 'Q3', 'Q3', 'Q3']\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "groups = df.groupby('Quarter')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "uuid": "a871b95e-5946-4b09-b8dc-bc9503d2ff14"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Quarter\n",
       "Q1    3\n",
       "Q2    3\n",
       "Q3    3\n",
       "dtype: int64"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.size()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "uuid": "804e567f-6b74-4405-a10e-d19d914655e7"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>-0.319314</td>\n",
       "      <td>0.370634</td>\n",
       "      <td>0.305396</td>\n",
       "      <td>-0.295772</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>0.168035</td>\n",
       "      <td>1.129395</td>\n",
       "      <td>-0.005765</td>\n",
       "      <td>-0.688388</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>-0.299357</td>\n",
       "      <td>0.603071</td>\n",
       "      <td>0.567948</td>\n",
       "      <td>-0.179203</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              No1       No2       No3       No4\n",
       "Quarter                                        \n",
       "Q1      -0.319314  0.370634  0.305396 -0.295772\n",
       "Q2       0.168035  1.129395 -0.005765 -0.688388\n",
       "Q3      -0.299357  0.603071  0.567948 -0.179203"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.mean()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "uuid": "7eb45e5c-b86f-4464-afd9-d5a3665e0f8e"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>No1</th>\n",
       "      <th>No2</th>\n",
       "      <th>No3</th>\n",
       "      <th>No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.514219</td>\n",
       "      <td>1.153036</td>\n",
       "      <td>0.435163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>1.618982</td>\n",
       "      <td>1.541605</td>\n",
       "      <td>0.672721</td>\n",
       "      <td>-0.104411</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>0.184519</td>\n",
       "      <td>0.937082</td>\n",
       "      <td>0.750445</td>\n",
       "      <td>1.361556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              No1       No2       No3       No4\n",
       "Quarter                                        \n",
       "Q1       0.981321  0.514219  1.153036  0.435163\n",
       "Q2       1.618982  1.541605  0.672721 -0.104411\n",
       "Q3       0.184519  0.937082  0.750445  1.361556"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.max()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">No1</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No2</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No3</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>max</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Q1</th>\n",
       "      <td>-1.75</td>\n",
       "      <td>0.98</td>\n",
       "      <td>0.26</td>\n",
       "      <td>0.51</td>\n",
       "      <td>-0.46</td>\n",
       "      <td>1.15</td>\n",
       "      <td>-1.07</td>\n",
       "      <td>0.44</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q2</th>\n",
       "      <td>-0.58</td>\n",
       "      <td>1.62</td>\n",
       "      <td>0.82</td>\n",
       "      <td>1.54</td>\n",
       "      <td>-0.44</td>\n",
       "      <td>0.67</td>\n",
       "      <td>-1.12</td>\n",
       "      <td>-0.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q3</th>\n",
       "      <td>-0.76</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.06</td>\n",
       "      <td>0.94</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.75</td>\n",
       "      <td>-1.44</td>\n",
       "      <td>1.36</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          No1         No2         No3         No4      \n",
       "          min   max   min   max   min   max   min   max\n",
       "Quarter                                                \n",
       "Q1      -1.75  0.98  0.26  0.51 -0.46  1.15 -1.07  0.44\n",
       "Q2      -0.58  1.62  0.82  1.54 -0.44  0.67 -1.12 -0.10\n",
       "Q3      -0.76  0.18  0.06  0.94  0.22  0.75 -1.44  1.36"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.aggregate([min, max]).round(2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "uuid": "542cf99a-bbf8-447e-9643-d6887ac74be7"
   },
   "outputs": [],
   "source": [
    "df['Odd_Even'] = ['Odd', 'Even', 'Odd', 'Even', 'Odd', 'Even',\n",
    "                  'Odd', 'Even', 'Odd']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "uuid": "f5144c9f-ff37-4e35-9417-e39debdcd45b"
   },
   "outputs": [],
   "source": [
    "groups = df.groupby(['Quarter', 'Odd_Even'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "uuid": "06904508-dbf1-431f-a3a2-681f29f03c51"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Quarter  Odd_Even\n",
       "Q1       Even        1\n",
       "         Odd         2\n",
       "Q2       Even        2\n",
       "         Odd         1\n",
       "Q3       Even        1\n",
       "         Odd         2\n",
       "dtype: int64"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups.size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "uuid": "b8471956-40fc-4203-a54a-aaa45f5a3c00"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">No1</th>\n",
       "      <th colspan=\"2\" halign=\"left\">No4</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Quarter</th>\n",
       "      <th>Odd_Even</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q1</th>\n",
       "      <th>Even</th>\n",
       "      <td>0.981321</td>\n",
       "      <td>0.981321</td>\n",
       "      <td>-1.070043</td>\n",
       "      <td>-1.070043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-1.939261</td>\n",
       "      <td>-0.969631</td>\n",
       "      <td>0.182727</td>\n",
       "      <td>0.091364</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q2</th>\n",
       "      <th>Even</th>\n",
       "      <td>1.035387</td>\n",
       "      <td>0.517693</td>\n",
       "      <td>-0.946847</td>\n",
       "      <td>-0.473423</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-0.531280</td>\n",
       "      <td>-0.531280</td>\n",
       "      <td>-1.118318</td>\n",
       "      <td>-1.118318</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">Q3</th>\n",
       "      <th>Even</th>\n",
       "      <td>-0.326238</td>\n",
       "      <td>-0.326238</td>\n",
       "      <td>-1.443217</td>\n",
       "      <td>-1.443217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Odd</th>\n",
       "      <td>-0.571834</td>\n",
       "      <td>-0.285917</td>\n",
       "      <td>0.905609</td>\n",
       "      <td>0.452805</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                       No1                 No4          \n",
       "                       sum      mean       sum      mean\n",
       "Quarter Odd_Even                                        \n",
       "Q1      Even      0.981321  0.981321 -1.070043 -1.070043\n",
       "        Odd      -1.939261 -0.969631  0.182727  0.091364\n",
       "Q2      Even      1.035387  0.517693 -0.946847 -0.473423\n",
       "        Odd      -0.531280 -0.531280 -1.118318 -1.118318\n",
       "Q3      Even     -0.326238 -0.326238 -1.443217 -1.443217\n",
       "        Odd      -0.571834 -0.285917  0.905609  0.452805"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "groups[['No1', 'No4']].aggregate([sum, np.mean])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Complex Selection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((10, 2))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(data, columns=['x', 'y'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 10 entries, 0 to 9\n",
      "Data columns (total 2 columns):\n",
      "x    10 non-null float64\n",
      "y    10 non-null float64\n",
      "dtypes: float64(2)\n",
      "memory usage: 240.0 bytes\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.356399</td>\n",
       "      <td>-1.232435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.544439</td>\n",
       "      <td>-0.668172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "1 -1.356399 -1.232435\n",
       "2 -0.544439 -0.668172\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.983310</td>\n",
       "      <td>0.357508</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-1.613579</td>\n",
       "      <td>1.470714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-1.188018</td>\n",
       "      <td>-0.549746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940046</td>\n",
       "      <td>-0.827932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "5 -0.983310  0.357508\n",
       "6 -1.613579  1.470714\n",
       "7 -1.188018 -0.549746\n",
       "8 -0.940046 -0.827932\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.tail()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1    False\n",
       "2    False\n",
       "3    False\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7    False\n",
       "8    False\n",
       "9    False\n",
       "Name: x, dtype: bool"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['x'] > 0.5  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1    False\n",
       "2    False\n",
       "3     True\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7    False\n",
       "8    False\n",
       "9    False\n",
       "dtype: bool"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(df['x'] > 0) & (df['y'] < 0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0     True\n",
       "1     True\n",
       "2     True\n",
       "3     True\n",
       "4     True\n",
       "5    False\n",
       "6    False\n",
       "7     True\n",
       "8     True\n",
       "9     True\n",
       "dtype: bool"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(df['x'] > 0) | (df['y'] < 0)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['x'] > 0]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('x > 0')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[(df['x'] > 0) & (df['y'] < 0)]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.query('x > 0 & y < 0')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>-1.690617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.356399</td>\n",
       "      <td>-1.232435</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.544439</td>\n",
       "      <td>-0.668172</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>-0.612939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>-1.733096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-1.188018</td>\n",
       "      <td>-0.549746</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940046</td>\n",
       "      <td>-0.827932</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622 -1.690617\n",
       "1 -1.356399 -1.232435\n",
       "2 -0.544439 -0.668172\n",
       "3  0.007315 -0.612939\n",
       "4  1.299748 -1.733096\n",
       "7 -1.188018 -0.549746\n",
       "8 -0.940046 -0.827932\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[(df.x > 0) | (df.y < 0)]  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       x      y\n",
       "0   True  False\n",
       "1  False  False\n",
       "2  False  False\n",
       "3   True  False\n",
       "4   True  False\n",
       "5  False   True\n",
       "6  False   True\n",
       "7  False  False\n",
       "8  False  False\n",
       "9   True   True"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df > 0  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>x</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.189622</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.007315</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.299748</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>0.357508</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>1.470714</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.108863</td>\n",
       "      <td>0.507810</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          x         y\n",
       "0  1.189622       NaN\n",
       "1       NaN       NaN\n",
       "2       NaN       NaN\n",
       "3  0.007315       NaN\n",
       "4  1.299748       NaN\n",
       "5       NaN  0.357508\n",
       "6       NaN  1.470714\n",
       "7       NaN       NaN\n",
       "8       NaN       NaN\n",
       "9  0.108863  0.507810"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df > 0]  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Concatenation, Joining and Merging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "df1 = pd.DataFrame(['100', '200', '300', '400'], \n",
    "                    index=['a', 'b', 'c', 'd'],\n",
    "                    columns=['A',])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A\n",
       "a  100\n",
       "b  200\n",
       "c  300\n",
       "d  400"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "df2 = pd.DataFrame(['200', '150', '50'], \n",
    "                    index=['f', 'b', 'd'],\n",
    "                    columns=['B',])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B\n",
       "f  200\n",
       "b  150\n",
       "d   50"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Concatenation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  NaN\n",
       "c  300  NaN\n",
       "d  400  NaN\n",
       "f  NaN  200\n",
       "b  NaN  150\n",
       "d  NaN   50"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.append(df2, sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "0  100  NaN\n",
       "1  200  NaN\n",
       "2  300  NaN\n",
       "3  400  NaN\n",
       "4  NaN  200\n",
       "5  NaN  150\n",
       "6  NaN   50"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.append(df2, ignore_index=True, sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  NaN\n",
       "c  300  NaN\n",
       "d  400  NaN\n",
       "f  NaN  200\n",
       "b  NaN  150\n",
       "d  NaN   50"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat((df1, df2), sort=False)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "0  100  NaN\n",
       "1  200  NaN\n",
       "2  300  NaN\n",
       "3  400  NaN\n",
       "4  NaN  200\n",
       "5  NaN  150\n",
       "6  NaN   50"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.concat((df1, df2), ignore_index=True, sort=False)  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Joining"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B    A\n",
       "f  200  NaN\n",
       "b  150  200\n",
       "d   50  400"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.join(df1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='left')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "f  NaN  200\n",
       "b  200  150\n",
       "d  400   50"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='right')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "b  200  150\n",
       "d  400   50"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='inner')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50\n",
       "f  NaN  200"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.join(df2, how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['A'] = df1['A']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A\n",
       "a  100\n",
       "b  200\n",
       "c  300\n",
       "d  400"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['B'] = df2  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({'A': df1['A'], 'B': df2['B']})  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    B\n",
       "a  100  NaN\n",
       "b  200  150\n",
       "c  300  NaN\n",
       "d  400   50\n",
       "f  NaN  200"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Merging"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "c = pd.Series([250, 150, 50], index=['b', 'd', 'c'])\n",
    "df1['C'] = c\n",
    "df2['C'] = c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>c</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C\n",
       "a  100    NaN\n",
       "b  200  250.0\n",
       "c  300   50.0\n",
       "d  400  150.0"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     B      C\n",
       "f  200    NaN\n",
       "b  150  250.0\n",
       "d   50  150.0"
      ]
     },
     "execution_count": 112,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  400  150.0   50"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  400  150.0   50"
      ]
     },
     "execution_count": 114,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "0  100    NaN  200\n",
       "1  200  250.0  150\n",
       "2  300   50.0  NaN\n",
       "3  400  150.0   50"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B  C_y\n",
       "0  200  250.0  200  NaN"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_on='A', right_on='B')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>200</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>50.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B    C_y\n",
       "0  100    NaN  NaN    NaN\n",
       "1  200  250.0  200    NaN\n",
       "2  300   50.0  NaN    NaN\n",
       "3  400  150.0  NaN    NaN\n",
       "4  NaN    NaN  150  250.0\n",
       "5  NaN    NaN   50  150.0"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_on='A', right_on='B', how='outer')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C_x</th>\n",
       "      <th>B</th>\n",
       "      <th>C_y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "      <td>250.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "      <td>150.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A    C_x    B    C_y\n",
       "b  200  250.0  150  250.0\n",
       "d  400  150.0   50  150.0"
      ]
     },
     "execution_count": 118,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, left_index=True, right_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>f</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "f  100    NaN  200\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', left_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>a</th>\n",
       "      <td>100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>200</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "a  100    NaN  200\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', right_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>b</th>\n",
       "      <td>200</td>\n",
       "      <td>250.0</td>\n",
       "      <td>150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>d</th>\n",
       "      <td>400</td>\n",
       "      <td>150.0</td>\n",
       "      <td>50</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      C    B\n",
       "b  200  250.0  150\n",
       "d  400  150.0   50"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.merge(df1, df2, on='C', left_index=True, right_index=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance Aspects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.random.standard_normal((1000000, 2))  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "16000000"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.nbytes  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame(data, columns=['x', 'y'])  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1000000 entries, 0 to 999999\n",
      "Data columns (total 2 columns):\n",
      "x    1000000 non-null float64\n",
      "y    1000000 non-null float64\n",
      "dtypes: float64(2)\n",
      "memory usage: 15.3 MB\n"
     ]
    }
   ],
   "source": [
    "df.info()  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 6.3 ms, sys: 14.8 ms, total: 21.1 ms\n",
      "Wall time: 4.88 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df['x'] + df['y']  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 231 ms, sys: 30.2 ms, total: 261 ms\n",
      "Wall time: 67.8 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.sum(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 81.4 ms, sys: 1.38 ms, total: 82.8 ms\n",
      "Wall time: 21 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.values.sum(axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.3872424 , -0.96934273, -0.86315944])"
      ]
     },
     "execution_count": 131,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 237 ms, sys: 9.42 ms, total: 246 ms\n",
      "Wall time: 60.7 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = np.sum(df, axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 62 ms, sys: 1.11 ms, total: 63.1 ms\n",
      "Wall time: 19.4 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = np.sum(df.values, axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.3872424 , -0.96934273, -0.86315944])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 42 ms, sys: 22.5 ms, total: 64.5 ms\n",
      "Wall time: 13.2 ms\n"
     ]
    }
   ],
   "source": [
    "%time res = df.eval('x + y')  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 18.8 s, sys: 56.8 ms, total: 18.9 s\n",
      "Wall time: 18.4 s\n"
     ]
    }
   ],
   "source": [
    "%time res = df.apply(lambda row: row['x'] + row['y'], axis=1)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    0.387242\n",
       "1   -0.969343\n",
       "2   -0.863159\n",
       "dtype: float64"
      ]
     },
     "execution_count": 139,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "res[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"http://hilpisch.com/tpq_logo.png\" alt=\"The Python Quants\" width=\"35%\" align=\"right\" border=\"0\"><br>\n",
    "\n",
    "<a href=\"http://tpq.io\" target=\"_blank\">http://tpq.io</a> | <a href=\"http://twitter.com/dyjh\" target=\"_blank\">@dyjh</a> | <a href=\"mailto:training@tpq.io\">training@tpq.io</a>"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
